package com.sys.utils;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * MD5 加密工具类
 * 
 * 功能说明：
 * 提供MD5哈希算法加密功能，主要用于密码加密存储
 * 
 * 注意事项：
 * 1. MD5是单向哈希算法，不可逆（无法解密）
 * 2. 相同输入永远产生相同输出
 * 3. 任意长度输入都产生固定长度输出（32位十六进制字符串）
 * 4. 生产环境建议使用更安全的算法如BCrypt或Argon2
 * 
 * @author Autism Intervention Team
 * @version 1.0
 */
public class MD5Util {

    /**
     * 对字符串进行MD5加密
     * 
     * 使用场景：
     * - 用户密码存储（数据库中存储MD5值而非明文）
     * - 数据完整性校验
     * - 生成唯一标识符
     * 
     * 示例：
     * MD5Util.encrypt("password123") 
     * -> "482c811da5d5b4bc6d497ffa98491e38"
     *
     * @param input 待加密的字符串（如：用户密码）
     * @return MD5加密后的32位十六进制字符串
     * @throws RuntimeException 如果MD5算法不可用（理论上不会发生）
     */
    public static String encrypt(String input) {
        try {
            // 1. 获取MD5摘要算法的 MessageDigest 对象
            MessageDigest md = MessageDigest.getInstance("MD5");
            
            // 2. 将输入字符串转换为UTF-8字节数组并更新摘要
            md.update(input.getBytes("UTF-8"));
            
            // 3. 完成哈希计算，获得密文字节数组
            byte[] digest = md.digest();
            
            // 4. 将密文字节数组转换成十六进制字符串
            StringBuilder sb = new StringBuilder();
            for (byte b : digest) {
                // %02x: 格式化为2位十六进制（不足补0）
                // & 0xff: 将byte转换为无符号整数
                sb.append(String.format("%02x", b & 0xff));
            }
            
            // 5. 返回32位十六进制字符串
            return sb.toString();
            
        } catch (Exception e) {
            // MD5算法是Java标准库的一部分，理论上不会抛出此异常
            // 如果发生，说明JDK有问题
            throw new RuntimeException("MD5 algorithm not found", e);
        }
    }
}